www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouS\PeerThread.cpp

    // PeerThread.cpp: implementation of the PeerThread.
// Download by http://www.NewXing.com
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PeerThread.h"
#include "globalhead.h"
#include "peersocket.h"
#include "CaptureScreen.h"
#include "LZWCompress.h"
#include "command.h"
#include "peersysteminit.h"
#include "peerregeditctrl.h"
#include "peerfileoperator.h"
#include "screenctrl.h"

//////////////////////////////////////////////////////////////////////
CONNECTTHREADLIST	listConnectThread;	//客户连接线程列表
UNUSEDTHREADLIST	listUnusedThread;	//不用的线程句柄列表
CRITICAL_SECTION	csProtectList;		//只允许同时一个线程访问这些列表
///////////////////////////////
//接受远程连接的线程
UINT WINAPI AcceptThread(PVOID pParam)
{
	CONNECTTHREAD connectthread;
	HANDLE hNewThread;
	DWORD  dwNewThreadID;
	SOCKET s; 
	WSAEVENT hEvnets[2];
	SOCKADDR ClientAddr;
	SOCKADDR_IN ClientAddrIn;
	int iAddrLen = sizeof(ClientAddr);
	CONNECTSOCKET ConnectSocketInfo;

	if(!PeerCreateSocket(&s,PEER_STREAM))
	{
		return -1;
	}
	if(!PeerBindSocket(s,szHostAddr,nHostPort))
	{
		PeerCloseSocket(s);
		return -1;
	}
	if(!PeerListenSocket(s))
	{
		PeerCloseSocket(s);
		return -1;
	}

	WSAEVENT hNetEvent = WSACreateEvent();
	if(hNetEvent == WSA_INVALID_EVENT)
	{
		PeerCloseSocket(s);
		return -1;
	}		
	
	hEvnets[0] = hExitEvent;
	hEvnets[1] = hNetEvent;

	int result = WSAEventSelect(s,hNetEvent,FD_ACCEPT);
	if(result == SOCKET_ERROR)
	{
		PeerCloseSocket(s);
		WSACloseEvent(hNetEvent);
		return -1;
	}
	//准备工作已经完毕
	SetEvent(hPrepareEvent);
	//等候网络时间完成的环境变量
	WSANETWORKEVENTS NetworkEvents;	
	for(;;)
	{
		DWORD EventCaused = WSAWaitForMultipleEvents(
			2,
			hEvnets,  
			FALSE,                  
			WSA_INFINITE, 
			FALSE);

		if(EventCaused == WSA_WAIT_FAILED || EventCaused == WAIT_OBJECT_0)
		{
			WSACloseEvent(hNetEvent);
			PeerCloseSocket(s);
			return -1;
		}

		result = WSAEnumNetworkEvents(
			s,                           
			hNetEvent,              
			&NetworkEvents);
		
		if(result == SOCKET_ERROR)						 
		{
			WSACloseEvent(hNetEvent);
			PeerCloseSocket(s);
			return -1;
		}

		if(NetworkEvents.lNetworkEvents == FD_ACCEPT)
		{
			SOCKET ClientSocket = WSAAccept(s, &ClientAddr, &iAddrLen, NULL, NULL);
			if(INVALID_SOCKET == ClientSocket)
			{
				continue; 
			}
			else
			{
				memcpy(&ClientAddrIn,&ClientAddr,sizeof(SOCKADDR_IN));
				strcpy(ConnectSocketInfo.IP,inet_ntoa(ClientAddrIn.sin_addr));
				ConnectSocketInfo.socket=ClientSocket;
				if((hNewThread=BeginPeerThread(ServerThread,&ConnectSocketInfo,&dwNewThreadID))==NULL)
					continue;
				else{
					connectthread.hThread=hNewThread;
					connectthread.threadID=dwNewThreadID;
					EnterCriticalSection(&csProtectList);
					listConnectThread.push_back(connectthread);
					LeaveCriticalSection(&csProtectList);
				}

			}
		}
	}
	WSACloseEvent(hNetEvent);
	PeerCloseSocket(s);
	return 0;
}
/////////////////////////////////
//服务线程
/////////////////////////////////
UINT WINAPI ServerThread(PVOID pParam)
{
	/////得到连接的socket//////
	CONNECTSOCKET SocketInfo;
	SocketInfo=*(CONNECTSOCKET*)pParam;
	SOCKET s;
	s=SocketInfo.socket;

	/////创建socket上的事件句柄////////

	WSAEVENT hEvent=WSACreateEvent();

	///////////////////////////////////

	DWORD retLen; //返回数据长度
	COMMAND command;//命令头

	///////////////////////////////////

	memset((char*)&command,0,sizeof(COMMAND));
	if(!PeerRecvDataS(s,(char*)&command,sizeof(command),&retLen,
					  hEvent,SENDRECV_TIMEOUT))
	{
		PeerCloseSocket(s);
		WSACloseEvent(hEvent);
		DeleteThread(CUR_THREADID);
		return 0;
	}
	switch(command.CommandID)
	{
		case PEER_SYSTEM_INIT:	//客户端循检时返回的系统信息
			SYSTEMINIT si;
			if(GetPeerSystemInfo(si))
				PeerSendDataS(s,(char*)&si,sizeof(si),&retLen,hEvent,
							  SENDRECV_TIMEOUT);
			break;
		case PEER_REGEDIT_ENUMVALUE:
			PeerRegeditEnumValue(s,hEvent);
			break;
		case PEER_REGEDIT_ENUMKEY:
			PeerRegeditEnumKey(s,hEvent);		
			break;
		case PEER_REGEDIT_CREATEKEY:
			PeerRegeditCreateKey(s,hEvent);
			break;
		case PEER_REGEDIT_DELETEKEY:
			PeerRegeditDeleteKey(s,hEvent);
			break;
		case PEER_REGEDIT_DELVALUE:
			PeerRegeditDelValue(s,hEvent);
			break;
		case PEER_REGEDIT_SETVALUE:
			PeerRegeditSetValue(s,hEvent);
			break;
		case PEER_REGEDIT_GETVALUE:
			PeerRegeditGetValue(s,hEvent);
			break;
		case PEER_FILE_GETDRIVER:
			PeerFileGetDriver(s,hEvent);
			break;
		case PEER_FILE_GETATTRIB:
			PeerFileGetAttrib(s,hEvent);
			break;
		case PEER_FILE_SAVEFILE:
			PeerFileSave(s,hEvent);
			break;
		case PEER_FILE_SENDFILE:
			PeerFileSend(s,hEvent);
			break;
		case PEER_FILE_CREATEDIR:
			PeerFileDirCreate(s,hEvent);
			break;
		case PEER_FILE_EXCUTE:
			PeerFileExcute(s,hEvent);
			break;
		case PEER_FILE_DELETEFILE:
			PeerFileDelete(s,hEvent);
			break;
		case PEER_KEYMOUSE:
			PeerScreenMouseKey(s,hEvent);
			break;
		case PEER_SCREEN_GET:
			PeerScreenGet(s,hEvent);
			CleanScreenInfo();
			break;
		case PEER_FONTTEXT:
			PeerScreenWrite(s,hEvent);
			break;

	}
	WSACloseEvent(hEvent);
	PeerShutDownSocket(s);
	PeerCloseSocket(s);
	DeleteThread(CUR_THREADID);
	return 0;
}

/////////////////////////////
//清理已经完成操作的线程的线程
UINT WINAPI CleanupThread(PVOID pParam)
{
	SetEvent(hPrepareEvent);
	UNUSEDTHREADLIST::iterator it;
	for(;;)
	{
		if(WaitForSingleObject(hExitEvent, PEER_CLEANTHREADTIME)==WAIT_TIMEOUT)
		{
			EnterCriticalSection(&csProtectList);
			while(listUnusedThread.size())
			{	
				HANDLE h = listUnusedThread.front(); 
				DWORD n = WaitForSingleObject(h,PEER_KILLTHREADTIME);
				if(n==WAIT_TIMEOUT)
				{
					TerminateThread(h,0);
				}
				CloseHandle(h);
				listUnusedThread.pop_front();
			}
			LeaveCriticalSection(&csProtectList);
		}
		else
			return 0;
	}
	return 0;
}
///////////////////////////
///删除已经执行完成线程句柄
void DeleteThread(DWORD dwThreadID)
{
	CONNECTTHREADLIST::iterator it;
	it=find_if(listConnectThread.begin(),listConnectThread.end(),bind2nd(IDCompare(),dwThreadID));
	if(it!=listConnectThread.end())
	{
		EnterCriticalSection(&csProtectList);
		listUnusedThread.push_back((*it).hThread);
		listConnectThread.erase(it);
		LeaveCriticalSection(&csProtectList);
	}
}
////////////////////////////////////////////////////////////